/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;


import fisica.AntecedenteHabitoFisica;
import fisica.CapaFisica;
import hibernate.objeto.Antecedente;
import hibernate.objeto.AntecedenteHabito;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.Vector;

/**
 *
 * @author Gonzalo
 */
public class AntecedenteHabitoLogica extends CapaLogica {

    /**
     * Crea y persiste el objeto AntecedenteHabito.
     *
     * @param datosAntecedentesHabito Los datos correspondientes al apartado
     * Antecedentes Hábitos
     * @param antecedente El antecedente al cual se asocia
     * @return true si se agregó/modificó correctamente, false en caso contrario
     */
    public static boolean agregarAntecedenteHabito(
            String[] datosAntecedentesHabito, Antecedente antecedente) {
        
        if (seDebeCrearAntecedenteHabito(datosAntecedentesHabito)) {
            //Crea el objeto Antecedenete Habito
            AntecedenteHabito antecedenteHabito = crearObjetoAntecedenteHabito(
                    datosAntecedentesHabito, antecedente);

            //Persiste el objeto
            CapaFisica.guardarOActualizarObjeto(antecedenteHabito);
            return true;
        } else {
            return true;
        }
    }

    /**
     * Crea un objeto AntecedenteHabito con los datos pasados por parámetro.
     *
     * @param antecedentesHabito Los datos particulares del objeto
     * @param antecedente El antecedente al cual se asocia
     * @return El objeto AntecedenteHabito recien creado
     */
    private static AntecedenteHabito crearObjetoAntecedenteHabito(
            String[] datosAntecedentesHabito, Antecedente antecedente){

        AntecedenteHabito antecedenteHabito = new AntecedenteHabito();

        antecedenteHabito.setAntecedente(antecedente);

        antecedenteHabito.setFechaAntecedenteHabito(new Date());

        antecedenteHabito.setAlimentacionCantidadAntecedenteHabito(
                datosAntecedentesHabito[ANTECEDENTE_HABITO_ALIMENTACION_CANTIDAD]);

        antecedenteHabito.setAlimentacionCalidadAntecedenteHabito(
                datosAntecedentesHabito[ANTECEDENTE_HABITO_ALIMENTACION_CALIDAD]);

        antecedenteHabito.setAlimentacionDietaAntecedenteHabito(
                datosAntecedentesHabito[ANTECEDENTE_HABITO_ALIMENTACION_DIETA]);

        antecedenteHabito.setAlcoholAntecedenteHabito(
                datosAntecedentesHabito[ANTECEDENTE_HABITO_ALCOHOL]);

        antecedenteHabito.setFumaAntecedenteHabito(
                datosAntecedentesHabito[ANTECEDENTE_HABITO_FUMA]);

        antecedenteHabito.setInfusionesAntecedenteHabito(
                datosAntecedentesHabito[ANTECEDENTE_HABITO_INFUSIONES]);

        antecedenteHabito.setSalAntecedenteHabito(
                datosAntecedentesHabito[ANTECEDENTE_HABITO_SAL]);

        antecedenteHabito.setActividadFisicaAntecedenteHabito(
                datosAntecedentesHabito[ANTECEDENTE_HABITO_ACTIVIDAD_FISICA]);

        antecedenteHabito.setSexualidadActividadAntecedenteHabito(
                datosAntecedentesHabito[ANTECEDENTE_HABITO_SEX_ACTIVIDAD]);

        antecedenteHabito.setSexualidadNumeroParejasAntecedenteHabito(
                Integer.valueOf(
                datosAntecedentesHabito[ANTECEDENTE_HABITO_SEX_NUMERO_PAREJAS]));

        antecedenteHabito.setAdiccionesInhalatoriaAntecedenteHabito(
                datosAntecedentesHabito[ANTECEDENTE_HABITO_ADICCIONES_INAHALATORIA]);

        antecedenteHabito.setAdiccionesEndovenosasAntecedenteHabito(
                datosAntecedentesHabito[ANTECEDENTE_HABITO_ADICCIONES_ENDOVENOSAS]);

        antecedenteHabito.setAdiccionesMarihuanaAntecedenteHabito(
                datosAntecedentesHabito[ANTECEDENTE_HABITO_ADICCIONES_MARIHUANA]);

        antecedenteHabito.setNotasAdicionalesAntecedenteHabito(
                datosAntecedentesHabito[ANTECEDENTE_HABITO_NOTAS_ADICIONALES]);

        return antecedenteHabito;
    }

    /**
     * Cheque si los datos son nulos.
     *
     * @param datosAntecedentesHabito Los datos a agregar
     * @return true si se debe crear el objeto AntecedenteHabito, false en caso
     * contrario
     */
    private static boolean seDebeCrearAntecedenteHabito(String[]
            datosAntecedentesHabito) {
        String[] datosAntecedentesHabitoVacio = {"", "", "", "", "", "", "",
                                                "", "", "0", "", "", "", ""};

        for (int i = 0; i < datosAntecedentesHabito.length; i++) {
            if (!datosAntecedentesHabito[i].equals(
                    datosAntecedentesHabitoVacio[i])) {
                return true;
            }
        }

        return false;
    }

    /**
     * Retorna el vector de objetos AntecedenteHabito según el id del paciente
     * ordenado decrecientemente por la fecha.
     *
     * @param idPaciente El id del paciente consultado
     * @return El vector de objetos AntecedenteHabito consultado, null si no
     * existe
     */
    public static Vector<AntecedenteHabito>
            getVectorAntecedenteHabitoPorIdPaciente(int idPaciente) {
        Vector<AntecedenteHabito> vectorAntecedenteHabito =
                AntecedenteHabitoFisica.getVectorAntecedenteHabitoPorIdPaciente(
                idPaciente);
        if (vectorAntecedenteHabito != null) {
            Collections.reverse(vectorAntecedenteHabito);
        }
        
        return vectorAntecedenteHabito;
    }

    /**
     * Retorna el último antecedente habito cargado del paciente.
     *
     * @param idAntecedente El id del antecedente asociado
     * @return El objeto AntecedenteHabito consultado, null si no existe
     */
    public static AntecedenteHabito
            getAntecedenteHabitoMasRecientePorIdAntecedente(
            int idAntecedente) {
        Vector<AntecedenteHabito> antecedenteHabito =
                AntecedenteHabitoFisica.
                getVectorAntecedenteHabitoPorIdAntecedente(idAntecedente);

        if (antecedenteHabito != null) {
            return antecedenteHabito.lastElement();
        } else {
            return null;
        }
    }

    /**
     * Retorna un arreglo de strings con las fechas de los objetos del vector.
     *
     * @param vectorAntecedenteHabito El vector de objetos AntecedenteHabito
     * @return Un arreglo de strings con las fechas de los antecedentes
     */
    public static String[] getListaDeFechaAntecedenteHabito(
            Vector<AntecedenteHabito> vectorAntecedenteHabito) {
        // El ComboBox necesita para ser cargado un arreglo de strings, por lo
        // que se crea
        String[] arregloStringAntecedenteHabito = vectorAArregloString(
                vectorAntecedenteHabito);

        return arregloStringAntecedenteHabito;
    }

    /**
     * Convierte un vector de AntecedenteHabito en un arreglo de las fechas de
     * los objetos.
     *
     * @param vectorAntecedenteHabito El vector de objetos AntecedenteHabito
     * @return La lista resultante cargada
     */
    private static String[] vectorAArregloString(
            Vector<AntecedenteHabito> vectorAntecedenteHabito) {

        int tamaño = vectorAntecedenteHabito.size() + 1;
        String[] arregloStringModificado = new String[tamaño];

        String primerElemento = "";

        arregloStringModificado[0] = primerElemento;
        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        String formattedDate;

        for (int i = 0; i < vectorAntecedenteHabito.size(); i++){
            formattedDate = formatter.format(vectorAntecedenteHabito.get(i).
                    getFechaAntecedenteHabito());
            arregloStringModificado[i+1] = "Nº " + i + ": " + formattedDate;
        }

        return arregloStringModificado;
    }

}
